package cn.tedu.service;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;

/**
 * @author Amos
 * @date 2021/9/11
 */

@Service // 完成IOC，有框架接管这个类，作用和@Component一致
@Aspect // 标记着这是一个aop的类：切面（切点和通知构成）
public class AopAspect {

    // 1. 切点(指定具体要用通知的类或者方法) 切点表达式 *表示1个 ..表示多个 *依次代表方法返回值，类名，方法名，(..)是参数列表
    @Pointcut("execution( * cn.tedu.service..*.*(..))")
    public void point() {}

    // 2. 通知(是一个方法自定义功能)
    @Around("point()") // 是一个环绕通知
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        long time = System.currentTimeMillis();// 计时开始
        Object o = joinPoint.proceed();// 去执行你的业务方法
        time = System.currentTimeMillis() - time; // 计时结束
        String methodname = joinPoint.getTarget().getClass().getName()//获取类名
                +"."+joinPoint.getSignature().getName();//获取方法名
        System.out.println(methodname + "方法执行时间为" + time); // cn.tedu.service.CarServiceImpl.get方法执行时间为11
        return o;
    }
}
